const { postRegister, preRegisterWithPassword } = require('../../lib/utils/register');
const { verifyCaptcha } = require('../../lib/utils/captcha');
const { CAPTCHA_SCENE, EMAIL_SCENE, LOG_TYPE } = require('../../common/constants');
const { verifyEmailCode } = require('../../lib/utils/verify-code');

/**
 * 通过邮箱+验证码注册普通用户
 * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#register-user-by-email
 * @param {Object} params
 * @param {String} params.email    邮箱
 * @param {String} params.password      密码
 * @param {String} params.nickname    昵称
 * @param {String} params.code  邮箱验证码
 * @param {String} params.inviteCode  邀请码
 * @returns
 */
module.exports = async function (params = {}) {
    const schema = {
        email: 'email',
        password: 'password',
        nickname: {
            required: false,
            type: 'nickname',
        },
        code: 'string',
        inviteCode: {
            required: false,
            type: 'string',
        },
    };
    this.middleware.validate(params, schema);
    const { email, password, nickname, code, inviteCode } = params;

    try {
        // 验证邮箱验证码，验证不通过时写入失败日志
        await verifyEmailCode({
            email,
            code,
            scene: EMAIL_SCENE.REGISTER,
        });
    } catch (error) {
        await this.middleware.uniIdLog({
            data: {
                email,
            },
            type: LOG_TYPE.REGISTER,
            success: false,
        });
        throw error;
    }

    const { user, extraData } = await preRegisterWithPassword.call(this, {
        user: {
            email,
        },
        password,
    });
    return postRegister.call(this, {
        user,
        extraData: {
            ...extraData,
            nickname,
            email_confirmed: 1,
        },
        inviteCode,
    });
};
